package view.kasse;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.awt.print.PrinterException;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import model.BilletSalg;
import model.EventSalg;
import model.Salg;
import model.VareSalg;
import utility.PriceFormater;

public class Kvittering extends javax.swing.JFrame implements Printable {

    private final Salg aktivtSalg;
    public static final int LINES_PER_PAGE = 60;
    private final Font standard;
    private final Font kategori;
    private final Font overskrift;
    private int lineCount;
    private int yCoord;
    private final int X_NAVN = 10;
    private final int X_STYK = 220;
    private final int X_ANTAL = 320;
    private final int X_TOTAL = 500;
    private static final Color KATEGORI_COLOR = new Color(240, 240, 240);
    private final ArrayList<EventSalg> eventSalgsListe;
    private final ArrayList<BilletSalg> billetSalgsListe;
    private final ArrayList<VareSalg> vareSalgsListe;
    private final String valuta;

    /**
     * Opretter et KvitteringsPanel
     *
     * @param salg
     */
    public Kvittering(Salg salg) {
        initComponents();
        aktivtSalg = salg;
        standard = new Font("Tahoma", 0, 11);
        kategori = new Font("Tahoma", 1, 11);
        overskrift = new Font("Meiryo", 0, 16);
        lineCount = 0;
        yCoord = 20;
        vareSalgsListe = aktivtSalg.getVareSalgsListe();
        billetSalgsListe = aktivtSalg.getBilletSalgsListe();
        eventSalgsListe = aktivtSalg.getEventSalgsListe();
        if (aktivtSalg.isValutaDKK()) {
            valuta = " kr";
        } else {
            valuta = " €";
        }
        jPanel1.repaint();
    }

    private int calcStringLenght(Graphics g, String str) {
        FontMetrics fm = g.getFontMetrics();
        return fm.stringWidth(str);
    }

    /**
     * Tegner Kvittering
     *
     * @param g Graphics
     * @param page int
     */
    public void tegnKvittering(Graphics g, int page) {
        yCoord = 20;
        lineCount = 0;
        tilføjSignatur(g);
        tilføjVareLinier(g);
        tilføjBilletLinier(g);
        tilføjEventLinier(g);
        tilføjRabatLinie(g);
        tilføjSlutLinier(g);

    }

    /**
     * Metoden tegner en signatur ved hjælp af et Graphics objekt og et Image
     *
     * @param g Graphics
     */
    private void tilføjSignatur(Graphics g) {
        g.setFont(overskrift);
        g.drawRect(0, 0, 550, 70);
        Image img = new ImageIcon(getClass().getResource("/images/overskrift.png")).getImage();
        g.drawImage(img, 0, 0, 550, 71, null);
        g.drawString("Kvittering:", X_STYK, yCoord + 70);
        yCoord = yCoord + 110;
        g.setFont(standard);
        g.drawString(aktivtSalg.toDatoString(), X_NAVN, yCoord);
        g.drawString("Betjent af: " + aktivtSalg.getAnsat().getFornavn(), X_STYK, yCoord);
        g.drawString("Afdeling: Helligåndshuset", 550-calcStringLenght(g, "Afdeling: Helligåndshuset"), yCoord);
        yCoord = yCoord + 30;
        g.drawString("Beskrivelse: ", X_NAVN, yCoord);
        g.drawString("Stk Pris:", X_STYK, yCoord);
        g.drawString("Antal:", X_ANTAL, yCoord);
        g.drawString("TotalBeløb", X_TOTAL, yCoord);
        yCoord = yCoord + 10;
        g.drawLine(0, yCoord, 550, yCoord);
        yCoord = yCoord + 20;
        lineCount = lineCount + 5;
    }

    /**
     * Metode tjekker aktive Salgs vareliste. Hvis den ikke er tom tegnes alle
     * objekter i listen ved 1 vare per linje ved brug af et Graphics objekt,
     * hvis der er rabat på objektet tegnes en ny linje med rabatoplysninger
     * under det pågældende Vare objekt
     *
     * @param g Graphics
     */
    private void tilføjVareLinier(Graphics g) {
        if (!vareSalgsListe.isEmpty()) {
            g.setFont(kategori);
            g.setColor(KATEGORI_COLOR);
            g.fillRect(5, yCoord - 15, 549, 20);
            g.setColor(Color.black);
            g.drawString("Varer: ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            lineCount++;
        }
        for (int i = 0; i < vareSalgsListe.size(); i++) {

            if (i < vareSalgsListe.size()) {

                g.drawString(vareSalgsListe.get(i).getVare().getVarenavn(), X_NAVN, yCoord);
                g.drawString(vareSalgsListe.get(i).getAntal() + " stk", X_ANTAL, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(vareSalgsListe.get(i).getTotalPris()) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(vareSalgsListe.get(i).getTotalPris()) + valuta), yCoord);
                if (aktivtSalg.isValutaDKK()) {
                    g.drawString(PriceFormater.formaterPrisTilString(vareSalgsListe.get(i).getVare().getUdsalgsprisDKKMedRabat()) + valuta, X_STYK, yCoord);
                } else {
                    g.drawString(PriceFormater.formaterPrisTilString(vareSalgsListe.get(i).getVare().getUdsalgsprisEUROMedRabat()) + valuta, X_STYK, yCoord);
                }
                if (vareSalgsListe.get(i).getRabat() > 0) {
                    yCoord = yCoord + 15;
                    g.drawString("Rabat", X_NAVN, yCoord);
                    g.drawString(-vareSalgsListe.get(i).getRabat() + " %", X_STYK, yCoord);
                    g.drawString(PriceFormater.formaterPrisTilString(-(vareSalgsListe.get(i).getTotalPris() - vareSalgsListe.get(i).getSalgsprisMedRabat())) + valuta,550-calcStringLenght(g, PriceFormater.formaterPrisTilString(-(vareSalgsListe.get(i).getTotalPris() - vareSalgsListe.get(i).getSalgsprisMedRabat())) + valuta), yCoord);
                    lineCount++;
                }
            }
            lineCount++;
            yCoord = yCoord + 20;
        }
    }

    /**
     * Metode tjekker aktive Salgs Billetliste. Hvis den ikke er tom tegnes alle
     * objekter i listen ved 1 vare per linje ved brug af et Graphics objekt,
     * hvis der er rabat på objektet tegnes en ny linje med rabatoplysninger
     * under det pågældende Billet objekt
     *
     * @param g Graphics
     */
    private void tilføjBilletLinier(Graphics g) {

        if (!billetSalgsListe.isEmpty()) {
            g.setFont(kategori);
            g.setColor(KATEGORI_COLOR);
            g.fillRect(5, yCoord - 15, 549, 20);
            g.setColor(Color.black);
            g.drawString("Billetter: ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            lineCount++;
        }
        for (int i = 0; i < billetSalgsListe.size(); i++) {

            if (i < billetSalgsListe.size()) {
                g.drawString(billetSalgsListe.get(i).getBillet().getBilletType(), X_NAVN, yCoord);
                g.drawString(billetSalgsListe.get(i).getAntal() + " stk", X_ANTAL, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(billetSalgsListe.get(i).getBilletSalgsTotalpris()) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(billetSalgsListe.get(i).getBilletSalgsTotalpris()) + valuta), yCoord);
                if (aktivtSalg.isValutaDKK()) {
                    g.drawString(PriceFormater.formaterPrisTilString(billetSalgsListe.get(i).getBillet().getPrisDKK()) + valuta, X_STYK, yCoord);
                } else {
                    g.drawString(PriceFormater.formaterPrisTilString(billetSalgsListe.get(i).getBillet().getPrisEURO()) + valuta, X_STYK, yCoord);
                }
                if (billetSalgsListe.get(i).getRabat() > 0) {
                    yCoord = yCoord + 15;
                    g.drawString("Rabat", X_NAVN, yCoord);
                    g.drawString(-billetSalgsListe.get(i).getRabat() + " %", X_STYK, yCoord);
                    g.drawString(PriceFormater.formaterPrisTilString(-(billetSalgsListe.get(i).getBilletSalgsTotalpris() - billetSalgsListe.get(i).getSalgsprisMedRabat())) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(-(billetSalgsListe.get(i).getBilletSalgsTotalpris() - billetSalgsListe.get(i).getSalgsprisMedRabat())) + valuta), yCoord);
                    lineCount++;
                }
            }
            lineCount++;
            yCoord = yCoord + 20;
        }
    }

    /**
     * Metode tjekker aktive Salgs eventliste. Hvis den ikke er tom tegnes alle
     * objekter i listen ved 1 vare per linje ved brug af et Graphics objekt,
     * hvis der er rabat på objektet tegnes en ny linje med rabatoplysninger
     * under det pågældende Event objekt
     *
     * @param g Graphics
     */
    private void tilføjEventLinier(Graphics g) {

        if (!eventSalgsListe.isEmpty()) {
            g.setFont(kategori);
            g.setColor(KATEGORI_COLOR);
            g.fillRect(5, yCoord - 15, 549, 20);
            g.setColor(Color.black);
            g.drawString("Event: ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            g.setFont(standard);
            lineCount++;
        }
        for (int i = 0; i < eventSalgsListe.size(); i++) {

            if (i < eventSalgsListe.size()) {
                g.drawString(eventSalgsListe.get(i).getEvent().getEventType().getNavn(), X_NAVN, yCoord);
                g.drawString(eventSalgsListe.get(i).getEvent().getAntalFremmødte() + " pers", X_ANTAL, yCoord);
                g.drawString(PriceFormater.formaterPrisTilString(eventSalgsListe.get(i).getSalgspris()) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(eventSalgsListe.get(i).getSalgspris()) + valuta), yCoord);
                if (aktivtSalg.isValutaDKK()) {
                    g.drawString(PriceFormater.formaterPrisTilString(eventSalgsListe.get(i).getEvent().getEventType().getPrisDKK()) + valuta, X_STYK, yCoord);
                } else {
                    g.drawString(PriceFormater.formaterPrisTilString(eventSalgsListe.get(i).getEvent().getEventType().getPrisEURO()) + valuta, X_STYK, yCoord);
                }
                if (eventSalgsListe.get(i).getRabat() > 0) {
                    yCoord = yCoord + 15;
                    g.drawString("Rabat", X_NAVN, yCoord);
                    g.drawString(-eventSalgsListe.get(i).getRabat() + " %", X_STYK, yCoord);
                    g.drawString(PriceFormater.formaterPrisTilString(-(eventSalgsListe.get(i).getSalgspris() - eventSalgsListe.get(i).getSalgsprisMedRabat())) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(-(eventSalgsListe.get(i).getSalgspris() - eventSalgsListe.get(i).getSalgsprisMedRabat())) + valuta), yCoord);
                    lineCount++;
                }
            }
            lineCount++;
            yCoord = yCoord + 20;
        }
    }
    
    private void tilføjRabatLinie(Graphics g){
        if(aktivtSalg.getRabat() != 0){
            g.setFont(kategori);
            g.setColor(KATEGORI_COLOR);
            g.fillRect(5, yCoord - 15, 549, 20);
            g.setColor(Color.black);
            g.drawString("Rabat på hele salget ", X_NAVN, yCoord);
            yCoord = yCoord + 20;
            lineCount++;
            g.setFont(standard);
            g.drawString("Rabat", X_NAVN, yCoord);
                    g.drawString(-aktivtSalg.getRabat() + " %", X_STYK, yCoord);
                    int totalPrisURabat = aktivtSalg.getVareSalgsListeTotalpris() + aktivtSalg.getBilletSalgsListeTotalpris() + aktivtSalg.getEventSalgsListeTotalpris();
                    g.drawString(PriceFormater.formaterPrisTilString(-(totalPrisURabat - aktivtSalg.beregnTotalBeløb())) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(-(totalPrisURabat - aktivtSalg.beregnTotalBeløb())) + valuta), yCoord);
                    lineCount++;
                    yCoord = yCoord+20;
        }
    }

    /**
     * Metoden tegner slutLinjer ved hjælp af et Graphics objekt med oplysninger
     * fra det pågældende salgs objekt.
     *
     * @param g Graphics
     */
    private void tilføjSlutLinier(Graphics g) {
        g.drawLine(0, yCoord, 550, yCoord);
        yCoord = yCoord + 20;
        if (aktivtSalg.isDankort()) {
            g.drawString("Dankort", X_STYK, yCoord);
            g.setFont(kategori);
            g.drawString("At betale i alt:", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(aktivtSalg.getTotalBeløb()) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(aktivtSalg.getTotalBeløb()) + valuta), yCoord);
        } else {
            g.drawString("Kontant", X_STYK, yCoord);
            g.setFont(kategori);
            g.drawString("At betale i alt:", X_NAVN, yCoord);
            g.drawString(PriceFormater.formaterPrisTilString(aktivtSalg.getTotalBeløb()) + valuta, 550-calcStringLenght(g, PriceFormater.formaterPrisTilString(aktivtSalg.getTotalBeløb()) +valuta), yCoord);
        }
        yCoord = yCoord + 60;
        g.setFont(kategori);
        g.drawString("Tak for besøget", 220, yCoord);
        lineCount = lineCount + 2;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel(){
            public void paint(Graphics g){
                super.paint(g);
                tegnKvittering(g, 0);
            }
        };

        setResizable(false);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 600, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 610, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel jPanel1;
    // End of variables declaration//GEN-END:variables

    @Override
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        int printResult;
        if (page > lineCount / LINES_PER_PAGE) {
            printResult = NO_SUCH_PAGE;
        } else {
            // Find øverste venstre hjørne i det printbare område
            // Forskyd g2d, så (0,0) svarer til øverste venstre hjørne
            Graphics2D g2d = (Graphics2D) g;
            double x0 = pf.getImageableX();
            double y0 = pf.getImageableY();
            g2d.translate(x0, y0);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            tegnKvittering(g2d, page);
            printResult = PAGE_EXISTS;
        }
        return printResult;
    }
}
